package base.thread_demo.demo08_03;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 演示:
 *
 * Thread..interrupt() 打断线程,并不会让线程任务不再继续执行,不会中断一个正在运行的线程
 * 没有任何语言方面的需求一个被中断的线程应该终止。中断一个线程只是为了引起该线程的注意，被中断线程可以决定如何应对中断。
 *
 * main 线程打断 t1,只会更改 t1线程的打断标识,不会干预 t1线程任务的执行,t1线程的任务可以根据状态决定走向.
 * 被打断的线程状态被更改,被打断的线程可以根据这个状态,来决定任务是否要继续执行.
 *
 * 注意:以上所说的 t1 被打断, 是说 t1 在正常执行过程中被打断,而不是在处于sleep,wait,join 期间时被打断.
 * t1线程处于这3种状态时被打断,打断标识并不会被改变(被重置了).
 */
public class InterruptThreadDemo2 {
    private static final Logger log = LoggerFactory.getLogger(InterruptThreadDemo2.class);

    public static void main(String[] args) throws InterruptedException {
        MyRun1 run = new MyRun1();
        Thread t1 = new Thread(run, "t1");
        t1.start();

        // main 线程休眠 5ms 后打断 t1 线程
        Thread.sleep(5);
        t1.interrupt();
        log.info("---------------------------> 线程 t1 被打断过了: {}",t1.isInterrupted());
    }
}

class MyRun1 implements Runnable {
    private static final Logger log = LoggerFactory.getLogger(MyRun1.class);

    @Override
    public void run() {
        log.info("task is running.........");
        while (true){
            log.info("{} 在执行任务....{}", Thread.currentThread().getName(), Thread.currentThread().isInterrupted());
//            if(Thread.currentThread().isInterrupted()) {
//                break;
//            }
        }
    }
}
